<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../Universal.css">
</head>
<body>
    
    <div id="cnblogs_post_body" class="blogpost-body">
        <h2>final关键字</h2>
    <p>继承的出现提高了代码的复用性，并方便开发。但随之也有问题，有些类在描述完之后，不想被继承，或者有些类中的部分方法功能是固定的，不想让子类重写。可是当子类继承了这些特殊类之后，就可以对其中的方法进行重写，那怎么解决呢？要解决上述的这些问题，需要使用到一个关键字final，final的意思为最终，不可变。final是个修饰符，它可以用来修饰类，类的成员，以及局部变量。</p>
    <h3>final的特点</h3>
    <p>final修饰类不可以被继承，但是可以继承其他类。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Yy {}
    </span><span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Fu <span style="color: rgba(0, 0, 255, 1)">extends</span> Yy{} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可以继承Yy类</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span> Zi <span style="color: rgba(0, 0, 255, 1)">extends</span> Fu{} <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不能继承Fu类</span></pre>
    </div>
    <pre>final修饰的方法不可以被覆盖,但父类中没有被final修饰方法，子类覆盖后可以加final。</pre>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Fu {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> final修饰的方法，不可以被覆盖，但可以继承使用</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method1(){}
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method2(){}
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span> Zi <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Fu {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">重写method2方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method2(){}
    }</span></pre>
    </div>
    <pre>final修饰的变量称为常量，这些变量只能赋值一次。</pre>
    <div class="cnblogs_code">
    <pre> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span> i = 20<span style="color: rgba(0, 0, 0, 1)">;
     i </span>= 30; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">赋值报错，final修饰的变量只能赋值一次</span></pre>
    </div>
    <pre>引用类型的变量值为对象地址值，地址值不能更改，但是地址内的对象属性值可以修改。</pre>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">final</span> Person p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
    Person p2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
    p </span>= p2; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">final修饰的变量p，所记录的地址值不能改变</span>
    p.name = "小明";<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可以更改p对象中name属性值
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">p不能为别的对象，而p对象中的name或age属性值可更改。</span></pre>
    </div>
    <pre>修饰成员变量，需要在创建对象前赋值，否则报错。(当没有显式赋值时，多个构造方法的均需要为其赋值。)</pre>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">直接赋值</span>
        <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span> m = 100<span style="color: rgba(0, 0, 0, 1)">;
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">final修饰的成员变量，需要在创建对象前赋值，否则报错。</span>
        <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> n;
        </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Demo(){
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">可以在创建对象时所调用的构造方法中，为变量n赋值</span>
            n = 2016<span style="color: rgba(0, 0, 0, 1)">;
        }
    }</span></pre>
    </div>
    <h2>static关键字</h2>
    <p>当在定义类的时候，类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时，这个方法没有访问到对象的特有数据时，方法创建这个对象有些多余。可是不创建对象，方法又调用不了，这时就会想，那么我们能不能不创建对象，就可以调用方法呢？可以的，我们可以通过static关键字来实现。static它是静态修饰符，一般用来修饰类中的成员。</p>
    <h3>static特点</h3>
    <p>被static修饰的成员变量属于类，不属于这个类的某个对象。（也就是说，多个对象在访问或修改static修饰的成员变量时，其中一个对象将static成员变量值进行了修改，其他对象中的static成员变量值跟着改变，即多个对象共享同一个static成员变量）</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> num = 100<span style="color: rgba(0, 0, 0, 1)">;
    }
    
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            Demo d1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Demo();
            Demo d2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Demo();
            d1.num </span>= 200<span style="color: rgba(0, 0, 0, 1)">;
            System.out.println(d1.num); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">结果为200</span>
            System.out.println(d2.num); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">结果为200</span>
    <span style="color: rgba(0, 0, 0, 1)">    }
    }</span></pre>
    </div>
    <p>被static修饰的成员可以并且建议通过类名直接访问。访问静态成员的格式：</p>
    <ul>
    <li>类名.静态成员变量名</li>
    <li>类名.静态成员方法名(参数)</li>
    <li>对象名.静态成员变量名 ------不建议使用该方式，会出现警告</li>
    <li>对象名.静态成员方法名(参数) ------不建议使用该方式，会出现警告</li>
    </ul>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态成员变量</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> num = 100<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(){
            System.out.println(</span>"静态方法"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            System.out.println(Demo.num);
            Demo.method();
        }
    }</span></pre>
    </div>
    <h3>static注意事项</h3>
    <p>静态内容是优先于对象存在，只能访问静态，不能使用this/super。静态修饰的内容存于静态区。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">成员变量</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> num = 100<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">this.num; 不能使用this/super。</span>
            System.out.println(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.num);
        }
    }</span></pre>
    </div>
    <p>同一个类中，静态成员只能访问静态成员。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">成员变量</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> num = 100<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态成员变量</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">int</span> count = 200<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态方法</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">System.out.println(num); 静态方法中，只能访问静态成员变量或静态成员方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        System.out.println(count);
        }
    }</span></pre>
    </div>
    <p>main方法为静态方法仅仅为程序执行入口，它不属于任何一个对象，可以定义在任意类中。</p>
    <h3>定义静态常量</h3>
    <p>开发中，我们想在类中定义一个静态常量，通常使用public static final修饰的变量来完成定义。此时变量名用全部大写，多个单词使用下划线连接。<br>定义格式：&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> 数据类型 变量名 = 值;</span>&nbsp;</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Company {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> String COMPANY_NAME = "百度"<span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(){
            System.out.println(</span>"一个静态方法"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }</span></pre>
    </div>
    <p>当我们想使用类的静态成员时，不需要创建对象，直接使用类名来访问即可。</p>
    <div class="cnblogs_code">
    <pre>System.out.println(Company.COMPANY_NAME); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印百度</span>
    Company.method(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用一个静态方法</span></pre>
    </div>
    <p>注意：</p>
    <ul>
    <li>接口中的每个成员变量都默认使用public static final修饰。</li>
    <li>所有接口中的成员变量已是静态常量，由于接口没有构造方法，所以必须显示赋值。可以直接用接口名访问。</li>
    </ul>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Inter {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> <span style="color: rgba(0, 0, 255, 1)">int</span> COUNT = 100<span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">访问接口中的静态变量</span>
    <span style="color: rgba(0, 0, 0, 1)">Inter.COUNT</span></pre>
    </div>
    <h2>匿名对象</h2>
    <p>匿名对象是指创建对象时，只有创建对象的语句，却没有把对象地址值赋值给某个变量。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> eat(){
            System.out.println();
        }
    }
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个普通对象</span>
    Person p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建一个匿名对象</span>
    <span style="color: rgba(0, 0, 255, 1)">new</span> Person();</pre>
    </div>
    <p>匿名对象的特点：</p>
    <p>创建匿名对象直接使用，没有变量名。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">new</span> Person().eat() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">eat方法被一个没有名字的Person对象调用了。</span></pre>
    </div>
    <p>匿名对象在没有指定其引用变量时，只能使用一次。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person().eat(); 创建一个匿名对象，调用eat方法
    </span><span style="color: rgba(0, 0, 255, 1)">new</span> Person().eat(); 想再次调用eat方法，重新创建了一个匿名对象</pre>
    </div>
    <p>匿名对象可以作为方法接收的参数、方法返回值使用</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> Person getPerson(){
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">普通方式
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Person p = new Person(); 
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">return p;
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">匿名对象作为方法返回值</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
        }
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> method(Person p){}
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Test {
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用getPerson方法，得到一个Person对象</span>
        Person person =<span style="color: rgba(0, 0, 0, 1)"> Demo.getPerson();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用method方法</span>
    <span style="color: rgba(0, 0, 0, 1)">    Demo.method(person);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">匿名对象作为方法接收的参数</span>
        Demo.method(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person());
        }
    }</span></pre>
    </div>
    <h2>内部类</h2>
    <p>将类写在其他类的内部，可以写在其他类的成员位置和局部位置，这时写在其他类内部的类就称为内部类。其他类也称为外部类。<br>什么时候使用内部类?在描述事物时，若一个事物内部还包含其他可能包含的事物，比如在描述汽车时，汽车中还包含这发动机，这时发动机就可以使用内部类来描述。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span> 汽车 { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">外部类</span>
        <span style="color: rgba(0, 0, 255, 1)">class</span> 发动机 { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">内部类</span>
    <span style="color: rgba(0, 0, 0, 1)">    }
    }</span></pre>
    </div>
    <h3>内部类的分类</h3>
    <p>内部类分为成员内部类与局部内部类。<br>定义内部类时，就是一个正常定义类的过程，同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。<br>成员内部类，定义在外部类中的成员位置。与类中的成员变量相似，可通过外部类对象进行访问<br>定义格式：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> 外部类 {
        修饰符 </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> 内部类 {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">其他代码</span>
    <span style="color: rgba(0, 0, 0, 1)">    }
    }</span></pre>
    </div>
    <p>访问方式：&nbsp;<span class="cnblogs_code">外部类名.内部类名 变量名 = <span style="color: rgba(0, 0, 255, 1)">new</span> 外部类名().<span style="color: rgba(0, 0, 255, 1)">new</span> 内部类名();</span></p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span> Body {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">外部类，身体</span>
        <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> life = <span style="color: rgba(0, 0, 255, 1)">true</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生命状态</span>
    
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Heart { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">内部类，心脏</span>
            <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> jump() {
                System.out.println(</span>"心脏噗通噗通的跳"<span style="color: rgba(0, 0, 0, 1)">)
                System.out.println(</span>"生命状态" + life); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">访问外部类成员变量</span>
    <span style="color: rgba(0, 0, 0, 1)">        }
        }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">访问内部类</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建内部类对象</span>
            Body.Heart bh = <span style="color: rgba(0, 0, 255, 1)">new</span> Body().<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Heart();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用内部类中的方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        bh.jump();
        }</span></pre>
    </div>
    <p>局部内部类，定义在外部类方法中的局部位置。与访问方法中的局部变量相似，可通过调用方法进行访问</p>
    <p>定义格式：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> 外部类 {
        修饰符 返回值类型 方法名(参数) {
            </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> 内部类 {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">其他代码</span>
    <span style="color: rgba(0, 0, 0, 1)">        }
        }
    } </span></pre>
    </div>
    <p>访问方式：在外部类方法中，创建内部类对象，进行访问</p>
    <p>局部内部类代码演示</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义类</span>
    <span style="color: rgba(0, 0, 255, 1)">class</span> Party {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">外部类，聚会</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> puffBall() {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 吹气球方法</span>
            <span style="color: rgba(0, 0, 255, 1)">class</span> Ball {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 内部类，气球</span>
                <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> puff() {
                    System.out.println(</span>"气球膨胀了"<span style="color: rgba(0, 0, 0, 1)">);
                }
            }
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">创建内部类对象，调用puff方法</span>
            <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Ball().puff();
        }
    }
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">访问内部类</span>
        <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">创建外部类对象</span>
            Party p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Party();
    </span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">调用外部类中的puffBall方法</span>
    <span style="color: rgba(0, 0, 0, 1)">        p.puffBall();
        }</span></pre>
    </div>
    <h3>内部类的实际使用——匿名内部类</h3>
    <p>内部类是为了应对更为复杂的类间关系。查看源代码中会涉及到，而在日常业务中很难遇到，这里不做赘述。最常用到的内部类就是匿名内部类，它是局部内部类的一种。<br>定义的匿名内部类有两个含义：</p>
    <ul>
    <li>临时定义某一指定类型的子类</li>
    <li>定义后即刻创建刚刚定义的这个子类的对象</li>
    
    
    
    </ul>
    <p>定义匿名内部类的作用与格式<br>作用：匿名内部类是创建某个类型子类对象的快捷方式。<br>格式：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> 父类或接口(){
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行方法重写</span>
    };</pre>
    </div>
    <p>代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">已经存在的父类：</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">abstract</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> eat();
    }
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义并创建该父类的子类对象，并用多态的方式赋值给父类引用变量</span>
        Person p = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person(){
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> eat() {
                System.out.println(“我吃了”);
            }
        };
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用eat方法</span>
    p.eat();</pre>
    </div>
    <p>使用匿名对象的方式，将定义子类与创建子类对象两个步骤由一个格式一次完成。虽然是两个步骤，但是两个步骤是连在一起完成的。</p>
    <p>匿名内部类如果不定义变量引用，则也是匿名对象。代码如下：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person(){
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> eat() {
            System.out.println(“我吃了”);
        }
    }.eat();</span></pre>
    </div>
    <h2>包的声明与访问</h2>
    <p>java的包，其实就是我们电脑系统中的文件夹，包里存放的是类文件。当类文件很多的时候，通常我们会采用多个包进行存放管理他们，这种方式称为分包管理。<br>在项目中，我们将相同功能的类放到一个包中，方便管理。并且日常项目的分工也是以包作为边界。<br>类中声明的包必须与实际class文件所在的文件夹情况相一致，即类声明在a包下，则生成的.class文件必须在a文件夹下，否则，程序运行时会找不到类。</p>
    <h3>包的声明格式</h3>
    <p>通常使用公司网址反写，可以有多层包，包名采用全部小写字母，多层包之间用”.”连接。<br>  类中包的声明格式： &nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">package</span> 包名.包名.包名…;</span>&nbsp;<br>如：黑马程序员网址itheima.com，那么网址反写就为com.itheima<br>注意：声明包的语句，必须写在程序有效代码的第一行（注释不算）<br>代码演示：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">package</span> cn.itcast; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">包的声明，必须在有效代码的第一行</span>
    
    <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Scanner;
    </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Random;
    
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> Demo {}</pre>
    </div>
    <h3>包的访问</h3>
    <p>在访问类时，为了能够找到该类，必须使用含有包名的类全名（包名.类名）。&nbsp;<span class="cnblogs_code">包名.包名….类名</span>&nbsp;，如： java.util.Scanner<br>带有包的类，创建对象格式：&nbsp;<span class="cnblogs_code">包名.类名 变量名 = new包名.类名();</span>&nbsp;比如cn.itcast.Demo d = new cn.itcast.Demo();<br>前提：包的访问与访问权限密切相关，这里以一般情况来说，即类用public修饰的情况。</p>
    <h3>类的简化访问</h3>
    <p>当我们要使用一个类时，这个类与当前程序在同一个包中（即同一个文件夹中），或者这个类是java.lang包中的类时通常可以省略掉包名，直接使用该类。<br>当我们要使用的类，与当前程序不在同一个包中（即不同文件夹中），要访问的类必须用public修饰才可访问。</p>
    <h3>import导包</h3>
    <p>我们每次使用类时，都需要写很长的包名。很麻烦，我们可以通过import导包的方式来简化。通过导包的方式使用该类，可以避免使用全类名编写（即，包类.类名）。<br>导包的格式：&nbsp;<span class="cnblogs_code"><span style="color: rgba(0, 0, 255, 1)">import</span> 包名.类名;</span>&nbsp;</p>
    <p>  当程序导入指定的包后，使用类时，就可以简化了。演示如下：</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入包前的方式
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建对象</span>
    java.util.Random r1 = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Random();
            java.util.Random r2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Random();
            java.util.Scanner sc1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Scanner(System.in);
            java.util.Scanner sc2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Scanner(System.in);
    
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入包后的方式</span>
            <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Random;
            </span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Scanner;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建对象</span>
            Random r1 = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Random();
            Random r2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Random();
            Scanner sc1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Scanner(System.in);
            Scanner sc2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Scanner(System.in);</pre>
    </div>
    <p>import导包代码书写的位置：在声明包package后，定义所有类class前，使用导包import包名.包名.类名;</p>
    <h2>访问修饰符</h2>
    <p>在Java中提供了四种访问权限，使用不同的访问权限时，被修饰的内容会有不同的访问权限，以下表来说明不同权限的访问能力：</p>
    <table style="height: 268px; width: 483px">
    <tbody>
    <tr>
    <td style="text-align: center" valign="top" width="77">&nbsp;</td>
    <td valign="center" width="109">
    <p>public</p>
    </td>
    <td valign="center" width="109">
    <p>protected</p>
    </td>
    <td valign="center" width="109">
    <p>default</p>
    </td>
    <td valign="center" width="109">
    <p>private</p>
    </td>
    </tr>
    <tr>
    <td valign="center" width="77">
    <p>同一类中</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    </tr>
    <tr>
    <td valign="center" width="77">
    <p>同一包中(子类与无关类)</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>&nbsp;</p>
    </td>
    </tr>
    <tr>
    <td valign="center" width="77">
    <p>不同包的子类</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>&nbsp;</p>
    </td>
    <td valign="center" width="109">
    <p>&nbsp;</p>
    </td>
    </tr>
    <tr>
    <td valign="center" width="77">
    <p>不同包中的无关类</p>
    </td>
    <td valign="center" width="109">
    <p>√</p>
    </td>
    <td valign="center" width="109">
    <p>&nbsp;</p>
    </td>
    <td valign="center" width="109">
    <p>&nbsp;</p>
    </td>
    <td valign="center" width="109">&nbsp;</td>
    </tr>
    </tbody>
    </table>
    <p>归纳总结：</p>
    <ul>
    <li>要想仅能在本类中访问使用private修饰；</li>
    <li>要想本包中的类都可以访问不加修饰符即可；</li>
    <li>要想本包中的类与其他包中的子类可以访问使用protected修饰</li>
    <li>要想所有包中的所有类都可以访问使用public修饰。</li>
    <li>注意：如果类用public修饰，则类名必须与文件名相同。一个文件中只能有一个public修饰的类。</li>
    </ul>
    <h2>代码块</h2>
    <p>局部代码块：局部代码块是定义在方法或语句中。<br>特点：</p>
    <ul>
    <li>以”{}”划定的代码区域，此时只需要关注作用域的不同即可</li>
    <li>方法和类都是以代码块的方式划定边界的</li>
    
    
    </ul>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Demo{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> x = 1<span style="color: rgba(0, 0, 0, 1)">;
                System.out.println(</span>"普通代码块" +<span style="color: rgba(0, 0, 0, 1)"> x);
            }
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> x = 99<span style="color: rgba(0, 0, 0, 1)">;
            System.out.println(</span>"代码块之外" +<span style="color: rgba(0, 0, 0, 1)"> x);
        }
    }</span></pre>
    </div>
    <p>构造代码块:构造代码块是定义在类中成员位置的代码块</p>
    <p>特点：</p>
    <ul>
    <li>优先于构造方法执行，构造代码块用于执行所有对象均需要的初始化动作</li>
    <li>每创建一个对象均会执行一次构造代码块。</li>
    </ul>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person {
        </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;
        </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age;
    
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造代码块</span>
    <span style="color: rgba(0, 0, 0, 1)">    {
            System.out.println(</span>"构造代码块执行了"<span style="color: rgba(0, 0, 0, 1)">);
        }
        Person(){
            System.out.println(</span>"Person无参数的构造函数执行"<span style="color: rgba(0, 0, 0, 1)">);
        }
        Person(</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age){
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.age =<span style="color: rgba(0, 0, 0, 1)"> age;
            System.out.println(</span>"Person（age）参数的构造函数执行"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> PersonDemo{
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
            Person p </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Person();
            Person p1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Person(23<span style="color: rgba(0, 0, 0, 1)">);
        }
    }</span></pre>
    </div>
    <p>静态代码块：静态代码块是定义在成员位置，使用static修饰的代码块。</p>
    <p>特点：<br>它优先于主方法执行、优先于构造代码块执行，当以任意形式第一次使用到该类时执行。<br>该类不管创建多少对象，静态代码块只执行一次。<br>可用于给静态变量赋值，用来给类进行初始化。</p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Person {
        </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;
        </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态代码块</span>
        <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)">{
            System.out.println(</span>"静态代码块执行了"<span style="color: rgba(0, 0, 0, 1)">);
        }
    }</span></pre>
    </div>
    <h2>知识点总结</h2>
    <p>1、final：关键字，最终的意思</p>
    <ul>
    <li>final修饰的类：最终的类，不能被继承</li>
    <li>final修饰的变量： 相当于是一个常量, 在编译生产.class文件后，该变量变为常量值</li>
    <li>final修饰的方法： 最终的方法，子类不能重写，可以继承过来使用</li>
    </ul>
    <p>2、static : 关键字， 静态的意思</p>
    <ul>
    <li>可以用来修饰类中的成员(成员变量，成员方法)</li>
    <li>也可以用来修饰成员内部类</li>
    </ul>
    <p>特点：</p>
    <ul>
    <li>被静态所修饰的成员，会被所有的对象所共享</li>
    <li>被静态所修饰的成员，可以通过类名直接调用，方便</li>
    </ul>
    <div class="cnblogs_code">
    <pre>Person.country = "中国"<span style="color: rgba(0, 0, 0, 1)">;
    Person.method();</span></pre>
    </div>
    <p>注意事项：</p>
    <ul>
    <li>静态的成员，随着类的加载而加载，优先于对象存在</li>
    <li>在静态方法中，没有this关键字</li>
    <li>静态方法中，只能调用静态的成员(静态成员变量，静态成员方法</li>
    </ul>
    <p>3、匿名对象：一个没有名字的对象<br>特点：</p>
    <ul>
    <li>创建匿名对象直接使用，没有变量名</li>
    <li>匿名对象在没有指定其引用变量时，只能使用一次</li>
    <li>匿名对象可以作为方法接收的参数、方法返回值使用</li>
    
    
    </ul>
    <p>4、内部类：在一个类中，定义了一个新类，这个新的类就是内部类 </p>
    <div class="cnblogs_code">
    <pre><span style="color: rgba(0, 0, 255, 1)">class</span> A {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">外部类</span>
        <span style="color: rgba(0, 0, 255, 1)">class</span> B{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 内部类</span>
    <span style="color: rgba(0, 0, 0, 1)">    }
    }</span></pre>
    </div>
    <p>特点：&nbsp;内部类可以直接访问外部类的成员，包含私有的成员</p>
    <p>5、包的声明与访问<br>类中包的声明格式： package 包名.包名.包名…;<br>带有包的类，创建对象格式：包名.类名 变量名 = new包名.类名();<br>6、导包的格式：import 包名.类名;</p>
    <p>7、权限修饰符</p>
    <ul>
    <li>    public : 公共的</li>
    <li>    protected: 受保护的</li>
    <li>    private : 私有的</li>
    <li>          public  protected 默认的 private</li>
    
    
    </ul>
    <p>8、代码块：</p>
    <ul>
    <li>    局部代码块：定义在方法中的，用来限制变量的作用范围</li>
    <li>    构造代码块：定义在类中方法外，用来给对象中的成员初始化赋值</li>
    <li>    静态代码块：定义在类中方法外，用来给类的静态成员初始化赋值</li>
    
    </ul>
    </div>

</body>
</html>